$title  boot cp/m   for CBIOS23        "BOOT23"         Date: 23/7-82
;
;
;       "bias" is address offset from 3400H for memory systems
;       than 16K (referred to as "b" throughout the text).
;
bias    equ     0A800h          ;(msize-20)*1024
ccp     equ     3400H+bias      ;base of ccp
bdos    equ     ccp+806h        ;base of bdos
bios    equ     ccp+1600h       ;base of bios
;
cdisk   equ     0004H   ;current disk number 0=A,...,15=P
iobyte  equ     0003h   ;intel i/o byte
;
;
nsects  equ     2CH     ;($-ccp)/128     ;warm start sector count
;
;       I/O port addresses
;
        mprot   equ     0F5h    ;write protect area 0 - 1fffh
;
;
;
        CR      EQU     0DH
        LF      EQU     0AH
        ETX     EQU     -1H
;
;
;
public  boot,wboot,STRING
;
;       external parametres
;
extrn   rdma,wboote,PTEXT,SIGNON
extrn   rsector,rtrack,ctb,text0,text1,text2,runit
extrn   pu0,pu1,unit
;
;       external routines
;
extrn   conout,seldsk,read,conin
extrn   setdma,settrk,setsec
;
;       cseg
;
;*******************************************************************************
;
;       cold boot from bootstrap loader
;
;*******************************************************************************
boot:
        di
        out     mprot
        lxi     sp,80h
        lxi     h,ccp           ;clear memory from ccp to 0
        lxi     d,-1
        xra     a
        STA     CDISK
        STA     IOBYTE
loop2:
        mov     m,a
        dad     d
        jc      loop2
;
        lxi     h,ptext
        CALL    STRING
input:                          ;get cr from keyboard
        call    conin
        cpi     0dh
        jnz     input
        mvi     c,19h
        call    conout
;
$E
;*******************************************************************************
;
;       warm boot
;
;       load cp/m and initiate parameters
;
;*******************************************************************************
;
wboot:
        DI
        LXI     H,SIGNON
        CALL    STRING
        MVI     A,0C9H
        STA     8
        STA     10H
        STA     18H
        STA     20H
        STA     28H
        STA     30H
        STA     38H
;
        MVI     A,-1
        sta     pu0             ;reset unit powerup flags for diskette units
        sta     pu1
        lxi     sp,80h          ;use space below buffer for stack
;
        lda     cdisk           ;get current disk
        mov     c,a
        call    seldsk          ;select current disk
        mov     a,l
        ora     h
        jz      wberror         ;selected unit illegal
;
;       give new line
;
        mvi     c,cr
        call    conout
        mvi     c,lf
        call    conout
;
;
;       load cp/m from selected unit
;
        mvi     a,-1
        sta     ctb+2           ;force unit changed
        mvi     b,nsects        ;b counts # of blocks to load
        mvi     a,0             ;first track
        sta     rtrack          ;load cp/m from track 0 sector 2 to 26
                                ;and track 1 sector 1 to 19
        lxi     d,128           ;block size
        mvi     a,2             ;first sector
        sta     rsector
        lxi     h,ccp           ;start of cp/m
        shld    rdma            ;set dma address
;
;       load cp/m
;
load:
        call    read            ;read one block
        ana     a               ;error?
        jnz     lerror          ;yes, error exit
        dcr     b               ;no, decrement sector load counter
        jz      gocpm           ;exit, cp/m loaded
        dad     d               ;update buffer pointer
        shld    rdma
        push    h               ;save load address
        lxi     h,rsector
        inr     m               ;update sector address
        mov     a,m
        cpi     26+1            ;end of track?
        jc      load2           ;no, continue on same track
load1:
        mvi     m,1             ;set sector addres to 1
        dcx     h
        inr     m               ;advance to next track
load2:
        pop     h               ;restore load address
        jmp     load            ;continue load prosess
;
;       error   illegal unit selected from warm boot
;
wberror:
        lxi     h,text1         ;select error message
        call    string          ;output string on co
;
;       ask operater for new unit number
;
ask:
        lxi     h,text0         ;select text string
        call    string
        call    conin           ;wait for answer from operater
        ani     0dfh            ;convert to capitoletter
        sui     'A'             ;A-P legal unit numbers
        jc      ask             ;illegal input
        cpi     04h
        jnc     ask             ;illegal input
        sta     cdisk           ;set new current disk
;
        jmp     wboot           ;start wboot
;
;
;       error during load of cp/m
;
lerror:
        lxi     h,text2         ;select text string
        call    string          ;display error message
        jmp     ask             ;get new unit parameter
$e
;*******************************************************************************
;
;       end of load operation, set parameters and go to cp/m
;
;*******************************************************************************
;
gocpm:
        mvi     a,0c3h  ;c3 is a jmp instruction
        sta     0       ;for jmp to wboot
        lxi     h,wboote;wboot entry point
        shld    1       ;set address field for jmp at 0
;
        sta     5       ;for jmp to bdos
        lxi     h,bdos  ;bdos entry point
        shld    6       ;address field of jump at 5 to bdos
;
        lxi     b,80h   ;default dma address is 80h
        call    setdma
;
        lda     cdisk   ;get current disk number
        mov     c,a     ;send to the ccp
        jmp     ccp     ;go to cp/m for further processing
;
;*************************************************
STRING:
        PUSH    B
STRNG1:
        MOV     A,M
        CPI     ETX
        JZ      SSEXIT
        MOV     C,A
        CALL    CONOUT
        INX     H
        JMP     STRNG1
SSEXIT:
        POP     B
        RET
;
        end
